"use strict";

var uk = require('./def.js');

/** 动作模板 */
uk.actions = {};

/**可以小于0的属性，影响更改属性时的检测 */
var canlesszeroprops = {};
/** 更改属性 */
uk.actions.change_props=function(src,tag,props,changed){
    var result = 0;
    for(var _k in props){
        if(tag.props.hasOwnProperty(_k)){
            var _pv = {};
            _pv[_k] = props[_k];
            if(!tag.on_action(uk.events.CHANGE_PROP,uk.event_status.BEFORE,src,_pv,changed)){
                result --;
                continue;
            }
            /* 0也通知下客户端，让客户端可以有效果表现出来
            if(_pv[_k] == 0)
                continue;*/
            var newv = tag.props[_k] + _pv[_k];
            if(!canlesszeroprops.hasOwnProperty(_k) && newv < 0)
                _pv[_k] = -tag.props[_k];
            tag.on_action(uk.events.CHANGE_PROP,uk.event_status.NOW,src,_pv,changed);
            if(changed != null)changed.change_prop(_k,_pv[_k]);
            tag.props[_k] += _pv[_k];
            tag.on_action(uk.events.CHANGE_PROP,uk.event_status.AFTER,src,_pv,changed);
            result ++;
            /**针对exp做特殊检测 */
            if(_k == 'exp'){
                var newexp = tag.props[_k] - tag.template.lvinfo[tag.props.lv].exp;
                if(newexp >= 0){/**升级啦 */
                    uk.actions.change_props(src,tag,{lv:1},changed);
                    /**升级后多余的经验加上去 */
                    changed.change_prop(_k,newexp);
                }
            }else if(_k == 'lv'){
                /** 等级提升，需要更新全部属性 */
                tag.reset();
                if(changed != null) changed.set_props(tag.props,false);
            }
        }
    }
    return result > 0;
}

/** 攻击 */
uk.actions.attack=function(src,tag,props,changed){
    props = uk.fastclone(props);
    /** 攻击，伤害值=伤害+自身攻击-对方防御，以后可以考虑暴击 */
    if(props.hasOwnProperty('hp')){
        props.hp = props.hp<0?-props.hp:props.hp;
        props.hp += src.props.atk - tag.props.def;
        /**保证属性为负值 */
        props.hp = (props.hp < 0)?0:-props.hp;
    }
    if(!tag.on_action(uk.events.ATTACK,uk.event_status.BEFORE,src,props,changed)){
        return false;
    }
    return uk.actions.change_props(src,tag,props,changed);
}

/** 恢复 */
uk.actions.recover=function(src,tag,props,changed){
    for(var k in props){
        var v = props[k];
        v = v<0?-v:v;
        if(tag.props.hasOwnProperty(k) && tag.props.hasOwnProperty('max'+k)){
            var maxv = tag.props['max'+k];
            var curv = tag.props[k];
            /**不能超过最大值 */
            v = curv + v > maxv?maxv-curv:v;
        }
        props[k] = v;
    }
    return uk.actions.change_props(src,tag,props,changed);
}

/** 添加buff */
uk.actions.add_buff=function(src,tag,buffid,changed){
    var b = uk.create_buff(buffid);
    if(!tag.on_action(uk.events.ADD_BUFF,uk.event_status.BEFORE,src,b,changed)){
        return false;
    }
    /**不可叠加，移除原来的 */
    if(0==(b.template.type & uk.buff_types.OVERLAPPED_ABLE)){
        for(var i in this.buffs){
            var bold = this.buffs[i];
            if(bold.template == b.template){
                uk.actions.del_buff_byindex(src,tag,i,changed);
                break;
            }
        }
    }
    tag.on_action(uk.events.ADD_BUFF,uk.event_status.NOW,src, b,changed);
    b.giver = src;
    b.owner = tag;
    if(changed != null){
        /**注意这里别直接加buff，否则组包消息的时候会死循环堆栈溢出 */
        changed.add_buff({id:b.id,bid:buffid,round:b.round});
    }
    tag.buffs.push(b);
    tag.on_action(uk.events.ADD_BUFF,uk.event_status.AFTER,src, b,changed);
    return true;
}

/** 删除buff */
uk.actions.del_buff=function(src,tag,buffid,changed){
    var buff = null;
    for(var _i = 0;i < tag.buffs.length;){
        if(tag.buffs[_i].template.id == buffid){
            if(!uk.actions.del_buff_byindex(src,tag,i,changed))
                return false;
        }else{++i;}
    }
    return true;
}

/** 删除buff */
uk.actions.del_buff_byid=function(src,tag,bid,changed){
    var buff = null;
    for(var _i in tag.buffs){
        if(tag.buffs[_i].id == bid){
            return uk.actions.del_buff_byindex(src,tag,_i,changed);
        }
    }
    return false;
}

/** 删除buff */
uk.actions.del_buff_byindex=function(src,tag,idx,changed){
    if(idx<0||idx>=tag.buffs.length)
        return true;
    var buff = tag.buffs[idx];
    if(!tag.on_action(uk.events.DEL_BUFF,uk.event_status.BEFORE,src,buff,changed)){
        return false;
    }
    tag.on_action(uk.events.DEL_BUFF,uk.event_status.NOW,src,buff,changed);
    if(changed != null)changed.del_buff(buff.id);
    tag.buffs.splice(idx,1);
    buff.template.on_deatch(buff,changed);
    tag.on_action(uk.events.DEL_BUFF,uk.event_status.AFTER,src,buff,changed);
    return true;
}